package org.artifact.core.context.packet;

import java.util.HashMap;
import java.util.Map;

import org.artifact.core.context.bytebuf.IByteBuff;
import org.artifact.core.lang.ISerializable;

import lombok.Data;

/**
 * 之所以Body采用Map的数据结构,有二点考虑。</br>
 * 一:避免在包编解码时避免2次序列化。</br>
 * 二:Map的结构可以在协议上向下兼容
 * @author : DengYing
 * @CreateDate : 2017年8月14日 上午11:53:18
 * @Description ：网络传输消息
 */
@Data
public abstract class IPacket implements ISerializable<IPacket>{
	/** 消息ID */
	private int id;
	/** 消息类型 */
	private byte type;
	/** 消息码 */
	private int cmd;
	/** 状态码 */
	private int status;
	/** 消息体 */
	private Map body = new HashMap<>();
	
	/** 取得模块ID */
	public int getModuleId() {
		return cmd >> 16;
	}
	
	/** 取得方法ID */
	public int getMethodId() {
		return getModuleId() << 16 ^ cmd;
	}

	@Override
	public IByteBuff toByteBuff(IByteBuff buff) {
		buff.writeInt(this.id);
		buff.writeByte(this.type);
		buff.writeInt(this.cmd);
		buff.writeInt(this.status);
		buff.writeMap(this.body);
		return buff;
	}

	@Override
	public IPacket forByteBuff(IByteBuff buff) {
		this.id = buff.readInt();
		this.type = buff.readByte();
		this.cmd = buff.readInt();
		this.status = buff.readInt();
		this.body = buff.readMap();
		return this;
	}
}
